package com.nageoffer.jobtrain.common.toolkit.utils;

import cn.hutool.core.util.StrUtil;
import cn.hutool.jwt.JWT;
import com.nageoffer.jobtrain.common.toolkit.biz.user.UserInfoDTO;
import com.nageoffer.jobtrain.common.toolkit.constant.JWTPlayLoadConstant;

import java.util.Date;
import java.util.Map;

/**
 * jwt 验证信息工具类
 * author：唐晨
 */
public class JWTUtils {
    /**
     * 生成 token密钥
     */
    private static String tokenKey = "tangChen";

    /**
     * 默认token过期时间
     */
    public static final long expire = 60 * 60 * 3;

    /**
     * jwt生成 token
     *
     * @param requestParam 用户负载信息
     * @return 生成的 token
     */
    public static String generateToken(Map<String, Object> requestParam) {
        JWT jwt = JWT.create();
        requestParam.forEach(jwt::setPayload);
        jwt.setKey(tokenKey.getBytes());
        jwt.setExpiresAt(new Date(System.currentTimeMillis() + expire * 1000));
        return jwt.sign();
    }

    /**
     * jwt生成 token
     *
     * @param requestParam 用户负载信息
     * @param expireTime   自定义过期时间
     * @return 生成的token
     */
    public static String generateToken(Map<String, Object> requestParam, long expireTime) {
        JWT jwt = JWT.create();
        requestParam.forEach(jwt::setPayload);
        jwt.setKey(tokenKey.getBytes());
        jwt.setExpiresAt(new Date(System.currentTimeMillis() + expireTime * 1000));
        return jwt.sign();
    }

    /**
     * 验证 token是否正确
     */
    public static boolean verify(String token) {
        if (StrUtil.isEmpty(token)) {
            return false;
        }
        return JWT.of(token).setKey(tokenKey.getBytes()).verify();
    }

    /**
     * 验证 token & 解析用户信息
     *
     * @param token jwt token
     * @return 用户信息
     */
    public static UserInfoDTO verifyAndGetUser(String token) {
        if (!verify(token)) {
            return null;
        }
        JWT jwt = JWT.of(token);
        String id = jwt.getPayload(JWTPlayLoadConstant.LOGIN_PLAY_LOAD_ID).toString();
        String username = jwt.getPayload(JWTPlayLoadConstant.LOGIN_PLAY_LOAD_USERNAME).toString();
        return UserInfoDTO.builder()
                .id(id)
                .username(username)
                .build();
    }
}